package com.iking.toolkit.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;

/**
 * 功能描述:文件格式转换工具类
 *
 * @author: yfl
 * @date: 2024/8/5 14:14
 */
@Slf4j
public class FileFormatUtil {
    /**
     * 提取文件后缀（不含点）
     * @param fileName 文件名
     * @return 后缀名（小写），如txt、docx等；无后缀则返回空字符串
     */
    public static String getFileSuffix(String fileName) {
        if (fileName == null || !fileName.contains(".")) {
            return "";
        }
        // 从最后一个点的位置截取，并转为小写
        return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
    }

    /**
     * 将字节数转换为合适的单位（B、KB、MB、GB）
     * @param bytes 文件大小（字节）
     * @return 格式化后的大小字符串，如"1.23 MB"
     */
    public static String formatFileSize(long bytes) {
        if (bytes < 0) {
            return "Invalid file size";
        }
        // 定义单位数组
        String[] units = {"B", "KB", "MB", "GB"};
        // 计算单位索引（默认B）
        int unitIndex = 0;
        double size = bytes;

        // 转换到合适的单位（大于1024时进位）
        while (size >= 1024 && unitIndex < units.length - 1) {
            size /= 1024;
            unitIndex++;
        }

        // 保留两位小数并拼接单位
        return String.format("%.2f %s", size, units[unitIndex]);
    }

    /**
     * 功能描述: 图片格式转换,BufferedImage转InputStream
     *
     * @param: [image, format]
     * @author: yfl
     * @date: 2024/8/5 14:15
     */
    public static InputStream bufferedImageToInputStream(BufferedImage image, String format) throws Exception {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, format, baos);
        baos.flush();
        byte[] imageInByte = baos.toByteArray();
        baos.close();
        return new ByteArrayInputStream(imageInByte);
    }

    /**
     * 功能描述: 文件格式转换,File转MultipartFile
     *
     * @param: [file, originalFilename]
     * @author: yfl
     * @date: 2024/8/7 15:16
     */
    public static MultipartFile fileToMultipartFile(File file, String originalFilename) throws IOException {
        FileInputStream fis = new FileInputStream(file);
        byte[] content = new byte[(int) file.length()];
        fis.read(content);
        fis.close();
        return new MockMultipartFile(originalFilename, originalFilename, "image/png", content);
    }

    /**
     * 功能描述: 图片格式转换BufferedImage转File
     *
     * @param: [bufferedImage, outputFilePath]
     * @author: yfl
     * @date: 2024/8/7 15:09
     */
    public static File convert(BufferedImage bufferedImage, String outputFilePath) {

        File file = new File(outputFilePath);
        try {
            // 指定输出文件格式，例如 "jpg", "png", "gif" 等
            ImageIO.write(bufferedImage, "png", new File(outputFilePath));
            System.out.println("BufferedImage已成功转换为File：" + outputFilePath);
        } catch (IOException e) {
            file.deleteOnExit();
            e.printStackTrace();
            System.err.println("转换过程中发生错误");
        }
        file.deleteOnExit();
        return file;
    }

    /**
     * 功能描述: 图片格式转换,BufferedImage转FIle
     *
     * @param: [image, formatName]
     * @author: yfl
     * @date: 2024/8/7 15:14
     */
    public static File bufferedImageToFile(BufferedImage image, String formatName) throws IOException {

        File tempFile = File.createTempFile(SysUtil.getUUID(), "." + formatName);
        tempFile.deleteOnExit(); // 清理临时文件
        ImageIO.write(image, formatName, tempFile);
        return tempFile;
    }

    /**
     * 功能描述: MultipartFile转File
     *
     * @param: [multipartFile]
     * @author: yfl
     * @date: 2024/8/7 15:34
     */
    public static File multipartFileToFile(MultipartFile multipartFile) throws IOException {
        File file = new File(System.getProperty("user.dir") + "/ocrJava/" + SysUtil.getRandom() + multipartFile.getOriginalFilename());
        // 确保目录存在
        if (!file.exists()) {
            // 创建目录，包括所需的任何父目录
            file.mkdirs();
        }
        multipartFile.transferTo(file);
        file.deleteOnExit();
        return file;
    }

}
